# Python结构模式匹配：match-case

# 1. 什么是match-case？
"""
Python 3.10版本(2021年10月)引入的新特性
结构模式匹配(Structural Pattern Matching)提供了一种比if-elif-else更强大的模式匹配方式
语法结构：
match 表达式:
    case 模式1:
        执行语句1
    case 模式2:
        执行语句2
    case _:  # 通配符，类似于else
        默认执行语句
"""

# 2. 基本用法示例

# 示例：根据命令执行不同操作
command = "exit"

match command:
    case "hello":
        print("你好！")
    case "exit":
        print("退出程序")
    case "help":
        print("显示帮助信息")
    case _:  # 通配符，匹配任何其他值
        print(f"未知命令: {command}")

# 3. 复杂模式匹配

# 3.1 变量绑定 - 在匹配的同时捕获值
status_code = 404

match status_code:
    case 200:
        print("请求成功")
    case 404:
        print("页面未找到")
    case code:  # 绑定变量
        print(f"其他状态码: {code}")

# 3.2 序列解构 - 匹配列表或元组内的元素
point = (3, 5)

match point:
    case (0, 0):
        print("原点")
    case (0, y):
        print(f"Y轴上的点，y = {y}")
    case (x, 0):
        print(f"X轴上的点，x = {x}")
    case (x, y):
        print(f"坐标点 ({x}, {y})")

# 3.3 映射解构 - 匹配字典中的键值对
user = {"name": "张三", "role": "admin"}

match user:
    case {"name": name, "role": "admin"}:
        print(f"管理员：{name}")
    case {"name": name, "role": "user"}:
        print(f"普通用户：{name}")
    case {"name": name}:
        print(f"未知角色用户：{name}")
    case _:
        print("格式错误")

# 3.4 OR模式 - 使用 | 匹配多个模式
num = 5

match num:
    case 1 | 3 | 5 | 7 | 9:
        print("奇数")
    case 2 | 4 | 6 | 8 | 10:
        print("偶数")
    case _:
        print("超出范围")

# 3.5 守卫语句(guard) - 添加if条件进一步筛选
age = 20

match age:
    case n if n < 18:
        print("未成年")
    case n if 18 <= n < 60:
        print("成年人")
    case n:
        print("老年人")

# 4. 与if-elif-else对比

# 示例：处理HTTP状态码

# 4.1 使用match-case实现
def handle_status_match(status):
    match status:
        case 200:
            return "成功"
        case 400 | 401 | 403:
            return "客户端错误"
        case 500 | 502 | 503:
            return "服务器错误"
        case _:
            return "未知状态"

# 4.2 使用if-elif-else实现
def handle_status_if(status):
    if status == 200:
        return "成功"
    elif status in (400, 401, 403):
        return "客户端错误"
    elif status in (500, 502, 503):
        return "服务器错误"
    else:
        return "未知状态"

# 测试两种实现
status = 401
print(f"match-case结果: {handle_status_match(status)}")
print(f"if-elif-else结果: {handle_status_if(status)}")

"""
match-case与if-elif-else对比：

优势：
1. 结构更清晰，特别是复杂条件时更易读
2. 支持解构匹配，可以直接从复杂数据结构中提取值
3. 在处理多种情况时代码更简洁

劣势：
1. 仅在Python 3.10及以上版本可用
2. 对于简单条件，if语句可能更直观
3. 学习曲线略高
"""

# 5. 实际应用案例

# 5.1 命令行参数处理
def process_command(command):
    match command.split():
        case ["help"]:
            return "显示帮助信息"
        case ["create", name]:
            return f"创建名为{name}的项目"
        case ["delete", name]:
            return f"删除名为{name}的项目"
        case ["move", source, target]:
            return f"将{source}移动到{target}"
        case _:
            return "无效命令"

# 测试命令处理
print(process_command("create myproject"))
print(process_command("move file1 folder2"))

# 5.2 简单状态机
def handle_event(state, event):
    match (state, event):
        case ("idle", "start"):
            return "running"
        case ("running", "pause"):
            return "paused"
        case ("paused", "resume"):
            return "running"
        case ("running" | "paused", "stop"):
            return "idle"
        case _:
            return state  # 状态不变

# 测试状态机
current_state = "idle"
current_state = handle_event(current_state, "start")
print(f"当前状态: {current_state}")
current_state = handle_event(current_state, "pause")
print(f"当前状态: {current_state}")

# 6. 最佳实践和注意事项
"""
最佳实践：
1. 当需要处理多种不同数据格式时，优先考虑使用match-case
2. 对于复杂数据结构的解析，match-case比多层if嵌套更清晰
3. 在需要从数据结构中提取多个值时，match-case更方便

注意事项：
1. 确保代码运行环境是Python 3.10或更高版本
2. 模式匹配是从上到下按顺序检查的，把更具体的模式放前面
3. 尽量避免过于复杂的模式，可能影响代码可读性
4. 通配符(_)通常放在最后作为默认情况处理
"""
